const qs = require('querystring');

module.exports = () => {
    // 添加一个中间件，为了解析请求体数据
    return async (ctx, next) => {
        // 只有 POST 和 PUT 请求，才需要解析 request body
        if (ctx.method === 'POST' || ctx.method === 'PUT') {
            // 因为接受数据是需要一段时间的，所以我们在接收完成之后，
            // 然后，这里使用 Promise 封装，就是为了使用 async / await 来处理
            ctx.request.body = await new Promise((resolve, reject) => {
                let data = '';

                // 监听传输事件，为了接受分块传输的数据
                ctx.req.on('data', (chunk) => {
                    data += chunk;
                });

                // 监听结束事件，转换成指定类型的数据
                ctx.req.on('end', () => {
                    let dataType = ctx.header['content-type'];

                    if (dataType === 'application/json;charset=UTF-8') {
                        resolve(JSON.parse(data));
                    } else if (
                        dataType === 'application/x-www-form-urlencodecd'
                    ) {
                        resolve(qs.parse(data));
                    }
                });

                // 如果出错了，就报错
                ctx.req.on('error', (errror) => {
                    reject(errror);
                });
            });
        }

        // 执行下一个中间件
        await next();
    };
};
